package oop

import (
	"math"
)

type Abser interface {
	Abs() float64
}

type Vertex struct {
	X, Y float64
}

func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func Abs(v Vertex) float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

//在以上代码中，函数 Abs 与 方法 Abs 语义是一样的，方法可以被认为是“语法糖”。但对于编译，Vertex 类型的数据可 静态 推导到接口类型

// A3Paper 没有实现接口
type A3Pager struct {
	Vertex
	W int
}

//构造方法
//为了实现 struct 的构造，golang 提供了一些编程约定（convention），例如：

func NewVertex() *Vertex {
	return &Vertex{}
}

// or
func (v Vertex) New() *Vertex {
	return &Vertex{}
}
